package com.itheima.controller;

import com.alibaba.dubbo.config.annotation.Reference;

import com.itheima.constant.MessageConstant;
import com.itheima.constant.RedisMessageConstant;
import com.itheima.entity.Result;
import com.itheima.pojo.LoginInfo;
import com.itheima.service.LoginUserService;
import com.itheima.utils.ValidateCodeUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

import javax.servlet.http.Cookie;

/**
 * 用户登陆时操作
 */
@RestController
@RequestMapping("/edit")
public class LoginUserController {
    @Reference
    private LoginUserService loginUserService;

    @Autowired
    private JedisPool jedisPool;

    //获取加盐加密的对象
    @Autowired
    private BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder();

    //手机验证码操作
    @RequestMapping("sendCodeTelEdit")
    private Result sendCodeFroLogin(String telephone){
        Jedis resource=null;
        //  随机生成4位数字验证码
        String code = ValidateCodeUtils.generateValidateCode4String(4);
        try {
        //  用户发送验证码(功能展示不显)
          //  SMSUtils.sendShortMessage(SMSUtils.VALIDATE_CODE,telephone,code);
            System.out.println(code);
        // 将验证码方法Redis中设置一天
            resource = jedisPool.getResource();
            resource.setex(telephone+ RedisMessageConstant.SENDTYPE_GETPWD,3600*12,code);
        //  返回结果
            return new Result(true, MessageConstant.SEND_VALIDATECODE_SUCCESS);
        } catch (Exception e) {
            e.printStackTrace();
            return new Result(false,MessageConstant.SEND_VALIDATECODE_FAIL);
        }finally {
            //释放资源
            if(resource!=null){
                resource.close();
            }
        }


    }

    //忘记密码修改密码
    @RequestMapping("editPassword")
    public Result editPassword(@RequestBody LoginInfo loginInfo){
//       对验证码进行判断
        Jedis resource=null;
        try {
            resource = jedisPool.getResource();
//          1.进行验证码校验
            String telephone = loginInfo.getTelephone();
            String code = loginInfo.getValidateCode();
//          2.从redis中取出保存的验证码
            String s = resource.get(telephone + RedisMessageConstant.SENDTYPE_GETPWD);
//          这里是验证码出现的问题有三种，一种是客户没有输入验证码，第二种是验证码失效，第三种是输出验证码错误
//           这里分别进行判断
            if(telephone==null||code==null){
                return new Result(false,MessageConstant.TELEPHONE_VALIDATECODE_NOTNULL);
            }
            if(s==null){
                return new Result(false,"验证码已失效");
            }
            if(!s.equals(code)){
                return new Result(false,MessageConstant.VALIDATECODE_ERROR);
            }
//           校验都通过了可以进行修改
//            对密码进行加盐加密,将修改过后的账号和密码进行设置
            String encode = bCryptPasswordEncoder.encode(loginInfo.getPassword());
            loginInfo.setPassword(encode);
            loginUserService.editUser(loginInfo);

//        客户端写入cookie，值为手机号，使用cookie的目的是为了跟踪用户，
//            1.创建cookie
            Cookie cookie = new Cookie("telephone",telephone);
//            2.设置cookie的存活时间,存活一个月
            cookie.setMaxAge(60*60*24*30);
//            3.设置cookie在服务器共享
            cookie.setPath("/");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if(resource!=null){
                resource.close();
            }
        }
        return new Result(true,"修改成功");
    }

}
